const fs = require('fs')
const chalk = require('chalk');
const mkdirp = require('mkdirp')
const glob = require('glob')
const path = require('path')
const prettier = require('prettier')
const sortPackage = require('sort-package-json')
    /**
     *将指定目录的文件复制到目标目录
     *存在同名文件则覆盖
     * @param {string} templatePath
     * @param {string} projectPath
     * @returns {string[]} 已处理的文件集
     */
function operateTemplatesFiles(templatePath, projectPath) {
    const fileList = []
    glob.sync('**/*', { cwd: templatePath, dot: true }).forEach((file) => {
        const fileDir = path.join(templatePath, file)
        const desDir = path.join(projectPath, file)
        const stat = fs.statSync(fileDir)
        if (stat.isFile()) {
            fileList.push(file)
            fs.copyFileSync(fileDir, desDir)
        } else if (stat.isDirectory()) {
            mkdirp.sync(desDir)
        }
    })
    return fileList
}

/**
 * 修改 antd package.json文件
 * @param { pkgObj } any  用户输入
 */
function modifyTemplatePkg(pkgObj) {
    const pkgPath = path.join(__dirname, '../custom/index.json')
    const Tempaltes = require('../custom/index.json')
    const { name, path: pathUrl, command } = pkgObj
    // 当前用户输入
    if (Array.isArray(Tempaltes)) {
        let filters = Tempaltes.filter((item) => item.name === name)
        if (filters.length > 0) {
            console.log(chalk.red('存在重复名,请重新输入'))
        } else {
            Tempaltes.push({
                "id": genID(8),
                "name": name,
                "path": pathUrl,
                command
            })
        }
        // 文本修改校验 进行修改后文本写入
        fs.writeFileSync(
            pkgPath,
            // 删除一个包之后 json会多了一些空行。sortPackage 可以删除掉并且排序
            // prettier 会容忍一个空行
            // 防止出现package出现无法解析问题
            prettier.format(JSON.stringify(sortPackage(Tempaltes)), {
                parser: 'json',
            }),
        )
        console.log(chalk.bgGreen('模板新增成功,请重新启用指令进行添加'))
    } else {
        let filters = [{
            "id": genID(8),
            "name": name,
            "path": pathUrl,
            command
        }];
        // 文本修改校验 进行修改后文本写入
        fs.writeFileSync(
            pkgPath,
            // 删除一个包之后 json会多了一些空行。sortPackage 可以删除掉并且排序
            // prettier 会容忍一个空行
            // 防止出现package出现无法解析问题
            prettier.format(JSON.stringify(sortPackage(filters)), {
                parser: 'json',
            }),
        )
        console.log(chalk.bgGreen('模板新增成功,请重新启用指令进行添加'))
    }

}
/**
 * 删除配置的模板
 * @param {string} delId 需要删除的id
 */
function delTemplatePkg(delId) {
    const pkgPath = path.join(__dirname, '../custom/index.json')
    const delTems = require('../custom/index.json')
    if (!Array.isArray(delTems)) {
        console.log(chalk.bgRed('未配置模板,请先新增模板'))
        return
    } else {
        if (delTems.length === 0) {
            console.log(chalk.bgRed('未配置模板,请先新增模板'))
            return
        }
        let news = delTems.filter(item => item.id !== delId)
            // 文本修改校验 进行修改后文本写入
        fs.writeFileSync(
            pkgPath,
            // 删除一个包之后 json会多了一些空行。sortPackage 可以删除掉并且排序
            // prettier 会容忍一个空行
            // 防止出现package出现无法解析问题
            prettier.format(JSON.stringify(sortPackage(news)), {
                parser: 'json',
            }),
        )
        console.log(chalk.bgGreen('模板删除成功,请重新启用指令进行操作'))
    }
}
/**
 * @function 修改以配置的模板
 * @param {Object}} answer 用户输入
 */
function editTemplatePkg(answer) {
    const { edit: id, name, pathUrl, command } = answer
    const pkgPath = path.join(__dirname, '../custom/index.json')
    const editTems = require('../custom/index.json')
    if (!Array.isArray(editTems) || editTems.length === 0) {
        console.log(chalk.bgRed('未配置模板,请先新增模板'))
        return
    } else {
        if (editTems.length === 0) {
            console.log(chalk.bgRed('未配置模板,请先新增模板'))
            return
        }
        let news = editTems.map(item => {
                if (item.id === id) {
                    item.name = name
                    item.path = pathUrl
                    if (command) {
                        item.command = command
                    }
                }
                return item
            })
            // 文本修改校验 进行修改后文本写入
        fs.writeFileSync(
            pkgPath,
            // 删除一个包之后 json会多了一些空行。sortPackage 可以删除掉并且排序
            // prettier 会容忍一个空行
            // 防止出现package出现无法解析问题
            prettier.format(JSON.stringify(sortPackage(news)), {
                parser: 'json',
            }),
        )
        console.log(chalk.bgGreen('模板修改成功,请重新启用指令进行操作'))
    }
}

function genID(length) {
    return Number(Math.random().toString().substr(3, length) + Date.now()).toString(36);
}
module.exports = {
    operateTemplatesFiles,
    modifyTemplatePkg,
    delTemplatePkg,
    editTemplatePkg,
}